/*
p_r0 = 0; // 用户数据中的第一个成绩行;
p_id = 0; // 用户数据中“学号”列的索引
p_name = 0; // 用户数据中“姓名”列的索引
p_score = 0; // 用户数据中“成绩”列的索引
*/

function UserTable(){}

ScoreSegs = /\s*,\s*|\s*，\s*|\s+/;
UserTable.Msg  = {
	EmptyScore:        '温馨提示：您录入的成绩单中未包含成绩列',
	User_Null:         '温馨提示：您录入的成绩单为空。',
	User_Null_Web:     '温馨提示：您录入的成绩单中未包含Web页面中的任何学生信息。',
	ColumnAlignError:  '错误提示：您录入的成绩单中的学号列、姓名列和成绩列未严格按列对其！如果已经对齐，请检查各列之间是否存在分隔符，分隔符可以是：任意空白符或中英文逗号。'
};

UserTable.prototype.getIdx = function(UserData){
	// 将“学号”列、“姓名”列和“成绩”列的索引初始化为-1
	var Idx = [[-1, -1, -1], [-1, -1, -1]];
	/**
	 * 注意：不能写成下面的方式（传引用）进行初始化
	 * var idx = [-1, -1, -1];
	 * var Idx = [idx, idx];
	 */
	var ptr = 0, counter = 0;
	var p_r0, r_r = [-1, -1];
	for(var ki = 0; ki < Idx.length; ki++){
		r_r = this.searchScoreRow(r_r[0]+1, UserData);
		
		if(ki == 0)
			p_r0 = r_r[0];
		
		if(ki == 0 && !r_r.length)
			throw UserTable.Msg.User_Null_Web;
		
		if(ki > 0 && !r_r.length){
			r_r[ki] = r_r[ki-1];
			break;
		}
		
		// 获取UserData的第一个成绩行的“学号”和“姓名”
		var id_web = globalWebScore[r_r[1]][0]; // UserData的第一个成绩行的“学号”，从WebData中获取
		var name_web = globalWebScore[r_r[1]][1]; // UserData的第一个成绩行的“姓名”，从WebData中获取
		
		// 通过第一个成绩行，定位“学号”列、姓名”列、“成绩”列的索引
		var ScoreRow = UserData[r_r[0]].trim().split(ScoreSegs);
		var ColNum = ScoreRow.length; // 成绩行的列宽
		//alert(ScoreRow)
		
		// 通过第一个成绩行查找“学号”列和“姓名”列的索引
		for(var i = 0; i < ColNum; i++){
			if(Idx[ki][0] > -1 && Idx[ki][1] > -1)
				break;
			if(ScoreRow[i].trim() == id_web)
				Idx[ki][0] = i; // “学号”列的索引
			else if(ScoreRow[i].trim() == name_web)
				Idx[ki][1] = i; // “姓名”列的索引
		}
		
		// 在第一个成绩行中查找"成绩"列的索引，从后向前查找，直至不为空，且不等于姓名列和学号列的索引
		for(var i = ColNum - 1; i > -1; i--){
			if(i == Idx[ki][0] || i == Idx[ki][1])
				continue;
			if(ScoreRow[i].trim() != ''){
				Idx[ki][2] = i;
				break;
			}
		}
		//alert('p_id = ' + Idx[ki][0] + '; p_name = ' + Idx[ki][1] + '; p_score = ' + Idx[ki][2]);
		if(ki == 0)
			continue;
		
		counter = 0;
		for(var j = 0; j < Idx[ptr].length; j++){
			if(Idx[ki][j] != Idx[ptr][j]){
				counter++;
				if(Idx[ki][j]*Idx[ptr][j] >= 0)
					throw UserTable.Msg.ColumnAlignError;
				if(Idx[ki][j] > -1){
					ptr = ki;
					//p_r0 = r_r[0];
				}
			}
		}
		if(counter > 1)
			throw UserTable.Msg.ColumnAlignError;
	}
	//alert('ptr=' + ptr + '\nr0_user=' + p_r0)
	if(Idx[ptr][0] == -1 && Idx[ptr][1] == -1)
		throw UserTable.Msg.User_Null_Web;
	
	// 如果成绩列与姓名列或学号列相同，则认为没有提供成绩列
	if(Idx[ptr][2] == Idx[ptr][0] || Idx[ptr][2] == Idx[ptr][1])
		throw UserTable.Msg.EmptyScore;
	
	//alert('p_id = ' + Idx[ptr][0] + '; p_name = ' + Idx[ptr][1] + '; p_score = ' + Idx[ptr][2]);
	return [p_r0, Idx[ptr]];
}

UserTable.prototype.searchScoreRow = function(r0, UserData){
	// 根据学号或者姓名，从第r0行开始，
	//   查找用户数据中第一个有学生信息或成绩的行（r_r[0]），以及与之相对应的WebData中的行（r_r[1]）
	var r_r = [-1, -1];
	for(var i = r0; i < UserData.length; i++) {
		var row = UserData[i];
		for(var j = 0; j < globalWebScore.length; j++) {
			if(row.indexOf(globalWebScore[j][0]) != -1 || row.indexOf(globalWebScore[j][1]) != -1){
				r_r = [i, j];
				break;
			}
		}
		if(r_r[0] > -1)
			break;
	}
	
	if(r_r[0] == -1)
		return [];
	
	return r_r;
}

function Test(){
	//globalWebScore = [['201226630420', '肖加龙', 15], ['201320100128', '朱佳柠', 16]];
	globalWebScore = [['201226630420', '肖加龙', 15], ['201320100128', '朱佳柠', 16], ['201326811102', '陈贺', 20]];
	
	//UserData = '201226630420x\n 201320100128x';
	
	UserDataList = [
		'肖加龙 201226630420, 5 \n 朱佳柠，201320100128，100 \n 陈草, 201326811102, 50'
		
		//' \t\n', // 用户输入为空：UserMsg.UserTable.Msg.User_Null
		//'201320100128, 朱佳柠, 100', // 只有一行
		//'201226630421, 肖加龙，5 \n 201320100128, 朱佳柠, 100', // 第一行学号出错
		//'201226630420, 肖米龙，5 \n 201320100128, 朱佳柠, 100', // 第一行姓名出错
		
		//'201226630420, 肖加龙 \n 朱佳柠, 201320100128, 100', // 第一行缺少成绩列，将报错：UserMsg.User_Less_Web //UserMsg.UserTable.Msg.ColumnAlignError
		//'肖加龙 201226630420, 5 \n 朱佳柠, 201320100128, 100 \n 陈贺, 201326811102, 50', // 姓名在前，学号在后, 完全正确：UserMsg.SucessLog
		//'201226630420, 肖加龙 5 \n 朱佳柠, 201320100128, 100 \n 陈贺, 201326811102, 50', // 学号列与成绩列不一致的情况：UserMsg.UserTable.Msg.ColumnAlignError
		/*'肖加龙 201226630420, 5 \n 朱佳柠, 201320100128, 100 \n 陈贺, 201326811103, 50', // 学号与姓名与web中的不一致：UserMsg.User_Conflict_Web
		'肖加龙 201226630420, 5 \n 朱佳柠, 201320100128, 100 \n 陈草, 201326811102, 50', // 学号与姓名与web中的不一致：UserMsg.User_Conflict_Web
		*/
		];
	
	for(var i = 0; i < UserDataList.length; i++){
		UserData = UserDataList[i];
		SendUserScore2Web();
	}
}
